﻿package planningsbord_v4.gui {
	
	import planningsbord_v4.model.Planningsbord;
	import planningsbord_v4.model.*;
	import flash.display.Sprite;
	import flash.display.Shape;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TouchEvent;
	import flash.system.*;
	
	/* 
	De PlanningsbordView class is de controller class
	die de gui van het planningsbord opzet. 
	*/
	public class PlanningsbordView extends Sprite {
		
		private var navigatieKolom:NavigatieKolom;
		private var medewerkerKolommen:Array;
		private var planningsKaarten:Array;
		private var model:Planningsbord;
		private var stageBreedte:int;
		private var stageHoogte:int;
		private var tussenruimte:Number = 10;
		
		/*
		Default contructor van de class PlanningsbordView
		*/
		public function PlanningsbordView( hetModel:Planningsbord, breedte:int, hoogte:int ):void {
							
			medewerkerKolommen = new Array();
			planningsKaarten = new Array();
			model = hetModel;
			stageBreedte = breedte;
			stageHoogte = hoogte;
			
			navigatieKolom = new NavigatieKolom(5, 5, (breedte / 6), hoogte-10);
			addChild(navigatieKolom);
			
			trace("kollomen maken");
			var verzorgenden:Array = hetModel.getVerzorgenden();
			for(var i:uint=0; i<verzorgenden.length; i++){
				addMedewerkerKolom((verzorgenden[i]));
				trace(i);
			}
			
			var kaarten:Array = model.getPlanningen()[0].getPatientenKaarten();
			for(i=0;i<kaarten.length;i++) {
				addPlanningKaart( kaarten[i] );
			}
		}
		
		/*
		Voegt een nieuwe medewerker kolom toe aan de GUI op basis van de 
		gegevens van een object van de class Verzorgende.
		*/
		public function addMedewerkerKolom( deMedewerker:Verzorgende ):void {
			
			var aantalKolommen = medewerkerKolommen.length + 1;
			var kolomX:Number;
			var kolomY:Number = 5;
			var kolomBreedte:Number;
			var kolomHoogte:Number = stageHoogte - 10;
			var medewerkerKolom:MedewerkerKolom;
			
			if( medewerkerKolommen.length == 0 )
			{
				// De eerste kolom maken
				kolomBreedte = (stageBreedte - navigatieKolom.width - navigatieKolom.x - tussenruimte*2)
				kolomX = navigatieKolom.x + navigatieKolom.width + tussenruimte;
			}
			else 
			{
				// Kolom toevoegen en de grootte aanpassen
				kolomBreedte = ((stageBreedte - navigatieKolom.width - navigatieKolom.x - tussenruimte) / aantalKolommen) - tussenruimte;
				kolomX = medewerkerKolommen[medewerkerKolommen.length-1].x + kolomBreedte + tussenruimte;
			}
			
			medewerkerKolom = new MedewerkerKolom(deMedewerker, kolomX, kolomY, kolomBreedte, kolomHoogte);
			medewerkerKolommen.push(medewerkerKolom);			
			addChild(medewerkerKolom);
			
			for(var i=0;i<medewerkerKolommen.length;i++) {
				medewerkerKolommen[i].x = (navigatieKolom.x + navigatieKolom.width + tussenruimte) + i*(kolomBreedte +tussenruimte);
				medewerkerKolommen[i].width = kolomBreedte;
			}
		}
		
		/*
		Voegt een object van de PlanningsKaart class toe aan de GUI op basis
		van de gegevens van een object van de PatientenKaart class.
		*/
		public function addPlanningKaart( deKaart:PatientenKaart ):void {
			var planningskaart:PlanningsKaart = new PlanningsKaart(deKaart, 10,400,medewerkerKolommen[0].width,medewerkerKolommen[0].height /15);
			planningskaart.addEventListener(TouchEvent.MOUSE_UP, releaseKaart);
			planningskaart.addEventListener(MouseEvent.MOUSE_UP, releaseKaart);
			planningskaart.addEventListener(TouchEvent.MOUSE_DOWN, pakKaart);
			planningskaart.addEventListener(MouseEvent.MOUSE_DOWN, pakKaart);
						
			planningsKaarten.push(planningskaart);
			addChild(planningskaart);
		}
		
		private function addMedewerkerKolommen():void {
			var verzorgenden:Array = model.getVerzorgenden();
			for(var i=0;i<verzorgenden.length;i++) {
				addMedewerkerKolom(verzorgenden[i]);
			}
		}
			
		
		private function releaseKaart(e:Event):void {
			if( !e.target.parent is PlanningsKaart ) { return; }
			var kaart:PlanningsKaart = e.target.parent;
			if( !kaart.isGepakt ) { return; }
			if( kaart.lastClick == 0 && e is TouchEvent) { return; }
			else { kaart.lastClick = 0; }
			// Controlleer of de kaart in de prullenbak geplaatst moet worden
			if ( kaart.hitTestObject( navigatieKolom.getPrullenbak() ) ) {
					trace("kaart in prullenbak");
					kaart.removeEventListener(MouseEvent.MOUSE_DOWN, pakKaart);
					kaart.removeEventListener(MouseEvent.MOUSE_UP, releaseKaart);
					kaart.removeEventListener(TouchEvent.MOUSE_DOWN, pakKaart);
					kaart.removeEventListener(TouchEvent.MOUSE_UP, releaseKaart);
					kaart.visible = false;
			}
			else {
				// Controlleer op welke kolom de kaart geplaatst moet worden
				for(var i=0;i<medewerkerKolommen.length;i++) {
					trace("release kaart");
					if( kaart.hitTestObject( medewerkerKolommen[i] ) ) {
						// plaats de kaart in de kolom
						medewerkerKolommen[i].addPlanningsKaart(kaart);
						kaart.x = medewerkerKolommen[i].x - 10;
						kaart.y = (medewerkerKolommen[i].getAantalKaarten() * kaart.height) - 402;
						kaart.getPatientenKaart().setVerzorgende( medewerkerKolommen[i].getVerzorgende() );
						trace( "De verzorgende: " +kaart.getPatientenKaart().getVerzorgende().getNaam() );
						break;
					}
				}
			}
			
			// Teken alle kaarten opnieuw
			for(var j=0; j<medewerkerKolommen.length;j++) {
				var kaarten:Array = medewerkerKolommen[j].getPlanningsKaarten();
				for(var k=0; k<kaarten.length;k++) {
					kaarten[k].y = -365 + (kaarten[k].height * k);
				}
			}
			e.stopPropagation();
			kaart.isGepakt = false;
		}
		private function pakKaart(e:Event):void {
			if( !e.target.parent is PlanningsKaart) { return; }
			
			var kaart:PlanningsKaart = e.target.parent;
			kaart.isGepakt = true;
			for(var i=0;i<medewerkerKolommen.length;i++) {
				if( kaart.getPatientenKaart().getVerzorgende() == medewerkerKolommen[i].getVerzorgende() ) {
					// verwijder de kaart uit de kolom
					medewerkerKolommen[i].removePlanningsKaart(kaart);
					trace("Kaart verwijdert");
					break;
				}
			}
			e.stopPropagation();
		}	
		
		public function getStageBreedte():Number {
			return stageBreedte;
		}
		public function getStageHoogte():Number {
			return stageHoogte;
		}
	}
}
